home *** CD-ROM | disk | FTP | other *** search
/ Aminet 43 / Aminet 43 (2001)(GTI - Schatztruhe)[!][Jun 2001].iso / Aminet / game / role / World.lha / source / world.c < prev   
C/C++ Source or Header  |  2001-03-06  |  11KB  |  566 lines

  1.  
  2. #include "parame.inc"
  3. #include "variab.h"
  4. #include "locdat.inc"
  5. #include "objdat.inc"
  6. #include "objdes.inc"
  7. #include "gtext.inc"
  8.  
  9. /* World C Version 1.00 copyright 1987 J.D.McDonald 
  10.    Use as you like for non-commercial purposes, but please
  11.    leave this note, and document any changes you make as yours */
  12.  
  13. static int     i, xloc, mxscor, succes, mloc, ikk, verb, vretrn;
  14. static int     scor, xretn, yretn, h, errflg;
  15.  
  16. main(argc,argv)
  17. char *argv[];
  18. {
  19.  
  20. #ifdef AMIGA
  21.     AmigaInit(argc,argv);
  22. #endif
  23.     rdinit();
  24.     wwflag = 0;
  25.     nomor = 0;
  26.     speak(29);
  27.     linout(" ", 1);
  28.     slflag = 0;
  29.     speak(gtext[1] + 1);
  30.     xindnt = 0;
  31.     for (i = 0; i < 9; i++)
  32.     marflg[i] = 0;
  33.     for (i = 0; i < 6; i++)
  34.     wirelc[i] = 0;
  35.     brfflg = 1;
  36.     deadf = 0;
  37.     dirty = 0;
  38.     turns = 0;
  39.     more = 0;
  40.     diesc = 0;
  41.     horflg = 0;
  42.     nonext = 0;
  43.     screef = 0;
  44.     spcloc = 0;
  45.     oldloc = 1;
  46.     oldlc2 = 1;
  47.     loc = 1;
  48.     xloc = 0;
  49.     oextim = 0;
  50.     rdietm = 0;
  51.     rvtim = 0;
  52.     gvtim = 0;
  53.     eattim = 0;
  54.     easttm = 0;
  55.     filmtm = 0;
  56.     filmst = 0;
  57.     machst = 0;
  58.     fimage = 0;
  59.     dial1x = -1;
  60.     dial2x = -1;
  61.     dial1 = 0;
  62.     dial2 = 0;
  63.     eastsc = 0;
  64.     cactsc = 0;
  65.     mxscor = 450;
  66.     bonus = 0;
  67.     jackpo = 0;
  68.     lpill = 0;
  69.     pbstat = 0;
  70.     dcombi = -1;
  71.     chaset = 0;
  72.     chaser = 0;
  73.     fshlif = 8;
  74.     noshoe = 8;
  75.     guardl = 0;
  76.     eolflg = 1;
  77.     linout(" ", 1);
  78.     /* the main command loop!!!!!  */
  79.  
  80. lab1:
  81.     if (eolflg) {
  82.     getln();
  83.     dotflg = 0;
  84.     clause = 1;
  85.     actor = 1;
  86.     lptr = 0;
  87.     }
  88.     succes = scan();
  89.     if (!succes)
  90.     eolflg = 1;
  91.     if (!succes)
  92.     goto lab1;
  93.     succes = parse();
  94.     clause += 1;
  95.     if (!succes)
  96.     eolflg = 1;
  97.     if (!succes)
  98.     goto lab1;
  99.     errflg = 0;
  100.     /******        for "tell someone" or "ask someone"  */
  101.  
  102.     if (actor != 1) {
  103.  
  104.     otheract();    /* perform verbs for other than player */
  105.  
  106.  
  107.     timer(xloc);
  108.     /* this goto is for permanent death due to radiation poisoning */
  109.  
  110.     {
  111.         if (rdietm == 50)
  112.         goto lab9000;
  113.         nonext = 1;
  114.         goto lab3000;
  115.     }
  116.     }
  117.     /******/
  118.  
  119.  
  120.  
  121.  
  122.     verb = wrdnum[0];
  123.  
  124.     playerv();    /* this does all the verbs for player */
  125.  
  126.  
  127.     if (errflg == 1)
  128.     goto lab9000;
  129.     if (errflg == 2)
  130.     goto lab9990;
  131.     {
  132.     if (deadf && loc >= 153)
  133.         goto lab9000;
  134.     }
  135.     timer(xloc);
  136.     /*
  137.      * this goto is for permanent death due to radiation poisoning or death
  138.      * in endgame 
  139.      */
  140.  
  141.     {
  142.     if (rdietm == 50 || (loc >= 153 && deadf))
  143.         goto lab9000;
  144.     }
  145.     h = 0;
  146.     {
  147.     if (loc != xloc) {
  148.         /* get out of any special locations (like on glass) */
  149.  
  150.         if (!(loc == 187 || loc == 184 || (loc >= 175
  151.                            && loc <= 181)))
  152.         spcloc = 0;
  153.         if (wirelc[5] == 1000 || obloc[ZWIRE] == 1000)
  154.         wdemon();
  155.         h = 1;
  156.     }
  157.     }
  158.     /* announce new location  */
  159.  
  160.     {
  161.     if (!nonext || (loc >= 7 && loc <= 11) ||
  162.         (loc >= 100 && loc <= 116)) {
  163.         linout(" ", 1);
  164.         if (loc >= 7 && loc <= 11)
  165.         h = 1;
  166.         vlocat(0, h);
  167.     }
  168.     if (loc >= 26 && loc <= 51) {
  169.         linout(" ", 1);
  170.         mdemon();
  171.     }
  172.     }
  173.  
  174.     /* cat function */
  175.  
  176. lab3000:
  177.     {
  178.     if (obloc[ZCAT] == 1000 || (obloc[ZCAT] == (2000 + ZKNAPS) &&
  179.              (obloc[ZKNAPS] == 3000 || obloc[ZKNAPS] == loc))) {
  180.         if (loc == 149 && obloc[ZCART] == 0) {
  181.         speak(290);
  182.         obloc[ZCAT] = loc;
  183.         obloc[ZCART] = loc;
  184.         } else if (obloc[ZCAT] == 2000 + ZKNAPS && obloc[ZKNAPS] == 3000
  185.                && pct(5)) {
  186.         speak(287);
  187.         obloc[ZCAT] = 1000;
  188.         } else if (pct(3))
  189.         speak(288);
  190.         else if (pct(3))
  191.         speak(289);
  192.     }
  193.     }
  194.     /* robot activation */
  195.  
  196.     {
  197.     if ((obimpr[RSLOT] & 8192) == 8192) {
  198.         obimpr[RSLOT] -= 8192;
  199.         if (obloc[ZCART] == 2000 + RSLOT)
  200.         speak(310);
  201.         else
  202.         speak(365);
  203.     }
  204.     }
  205.     /* give bonus for reaching cygnus or deneb */
  206.  
  207.     {
  208.     if (loc == 183) {
  209.         if ((locdat[183] & 16384) == 0) {
  210.         speak(549);
  211.         bonus += 5;
  212.         } else if (xloc != loc)
  213.         speak(550);
  214.     } else if (loc == 186) {
  215.         if ((locdat[186] & 16384) == 0)
  216.         speak(547);
  217.         else if (xloc != loc)
  218.         speak(548);
  219.     } else if (loc == 190) {
  220.         speak(551);
  221.         bonus += 5;
  222.         goto lab9000;
  223.     }
  224.     }
  225.     {
  226.     if (loc == xloc && loc == 171) {
  227.         speak(557);
  228.         vdead();
  229.         goto lab9000;
  230.     }
  231.     }
  232.     xloc = loc;
  233.     turns += 1;
  234.     nonext = 0;
  235.     /* we have visited this location  */
  236.  
  237.     locdat[loc] |= 16384;
  238.     linout(" ", 1);
  239.     goto lab1;
  240. lab9000:
  241.     linout(" ", 1);
  242.     scor = scorng() + bonus * 5;
  243.     scorpt(scor, mxscor);
  244.     goto lab9999;
  245. lab9990:
  246.     endsl();
  247. lab9999:
  248. #ifdef AMIGA
  249.     ttclose();
  250. #endif
  251. }
  252.  
  253. /* end of main program  */
  254.  
  255.  
  256. otheract()
  257. {
  258.     static int      actok;
  259.  
  260.     if (actor == MARTIA) {
  261.     if (martim == 7 && loc >= 27 && loc <= 51)
  262.         speak(167);
  263.     else
  264.         speak(168);
  265.     } else if (actor == ROBOT) {
  266.     {
  267.         if (chgact == 1)
  268.         actok = 1;
  269.     }
  270.     /* test to see if robot can "hear"  */
  271.  
  272.     if (chgact == 1 && obloc[CCART] == (2000 + RSLOT) &&
  273.         (loc == 146 || obloc[ZROBOT] == loc)) {
  274.         speak(366);
  275.         actok = 0;
  276.     } else if (chgact == 1 && !((loc == obloc[ZROBOT] ||
  277.                loc == 146) && obloc[ZCART] == (2000 + RSLOT))) {
  278.         speak(314);
  279.         actok = 0;
  280.     } else if (chgact == 0 && actok == 0);
  281.     else if (wrdnum[0] == GO) {
  282.         mloc = obloc[ZROBOT];
  283.         vgo();
  284.         {
  285.         if (obloc[ZROBOT] == 90)
  286.             obimpr[ZROBOT] = 2257;
  287.         }
  288.         {
  289.         if (rmove == 1 && (loc == mloc))
  290.             speak(316);
  291.         else if (rmove == 1 && mloc != loc && obloc[ZROBOT] == loc)
  292.             speak(317);
  293.         else if (rmove == 1 && loc == 146)
  294.             robdsc();
  295.         }
  296.         {
  297.         if (obloc[ZROBOT] == 90) {
  298.             if (obloc[ZORCHI] == 2000 + ZROBOT)
  299.             obloc[ZORCHI] = 0;
  300.             else if (obloc[ZFLYTR] == 2000 + ZROBOT)
  301.             obloc[ZFLYTR] = 0;
  302.         }
  303.         }
  304.     } else if (wrdnum[0] == TAKE || wrdnum[0] == DROP ||
  305.            wrdnum[0] == PUT || wrdnum[0] == IS || wrdnum[0] ==
  306.            TRANSL || wrdnum[0] == WASH || wrdnum[0] == QWATER
  307.            || wrdnum[0] == HOLD || wrdnum[0] == GIVE)
  308.         vrobot();
  309.     else
  310.         speak(315);
  311.     } else if (actor == FERRET) {
  312.     if (loc != 131 && loc != 99 && loc != 100)
  313.         speak(435);
  314.     else
  315.         speak(436);
  316.     } else if (actor == CACTUS) {
  317.     if (loc != 82)
  318.         speak(437);
  319.     else if (cactsc != 3)
  320.         speak(438);
  321.     /* cactus freezing scree sclope */
  322.  
  323.     else if ((wrdnum[0] == HOLD || wrdnum[0] == FREEZE) &&
  324.          dobjs[0] == GRAVEL) {
  325.         screef = 4;
  326.         speak(441);
  327.     } else
  328.         speak(237);
  329.     } else if (actor == GUARD) {
  330.     if (loc == guardl || loc == 171 || (chaset != 0 &&
  331.                         chaset <= 9))
  332.         speak(562);
  333.     else
  334.         speak(561);
  335.     } else
  336.     speak(251);
  337. }
  338.  
  339. playerv()
  340. {
  341.     if (verb < TAKE) {
  342.     vretrn = 1;
  343.     {
  344.         if (verb == RUN)
  345.         vretrn = vrun();
  346.         else if (verb == CRAWL)
  347.         vretrn = vcrawl();
  348.         else if (verb == CROSS)
  349.         vretrn = vcross();
  350.         else if (verb == JUMP)
  351.         vretrn = vjump();
  352.         else if (verb == ASCEND) {
  353.         prepdo = UP;
  354.         vretrn = vclimb();
  355.         } else if (verb == DESCEN) {
  356.         prepdo = DOWN;
  357.         vretrn = vclimb();
  358.         } else if (verb == CLIMB)
  359.         vretrn = vclimb();
  360.         else if (verb == SWIM)
  361.         vretrn = vswim();
  362.     }
  363.  
  364.     /*
  365.      * if vretrn=0, then the action is complete if vretrn=1, then a
  366.      * translation to "go" occured or the verb was actually "go" 
  367.          */
  368.  
  369.     {
  370.         if (vretrn == 1)
  371.         vgo();
  372.     }
  373.     } else if (verb == QUIT) {
  374.     if (yesx(101))
  375.         errflg = 1;    /* out after scoring */
  376.  
  377.     } else if (verb == DAMN)
  378.     dirty += 1;
  379.     else if (verb == SUSPEN)
  380.     if (chaset == 0)
  381.         vsuspe(0);
  382.     else
  383.         speak(559);
  384.     else if (verb == RESTOR) {
  385.     if (vsuspe(1)) {
  386.         eolflg = 1;
  387.         nonext = 0;
  388.         actor = 1;
  389.         xloc = loc;
  390.     }
  391.     } else if (verb == BRIEF)
  392.     brfflg = 1;
  393.     else if (verb == VERBOS)
  394.     brfflg = 2;
  395.     else if (verb == SUPERB)
  396.     brfflg = 0;
  397.     else if (verb == QMORE)
  398.     nomor = 0;
  399.     else if (verb == NOMORE)
  400.     nomor = 1;
  401.     else if (verb == SCORE) {
  402.     scor = scorng() + bonus * 5;
  403.     scorpt(scor, mxscor);
  404.     } else if (verb == HELP)
  405.     vhelp();
  406.     else if (verb == RETREA)
  407.     vretre();
  408.     else if (verb == PRAY) {
  409.     if (!deadf || loc != 61)
  410.         speak(44);
  411.     else {
  412.         deadf = 0;
  413.         speak(45);
  414.         nonext = 1;
  415.         noshoe = 8;
  416.     }
  417.     } else if (verb == DEBUG)
  418.     dbg();
  419.     else if (verb == LOCATE) {
  420.     vlocat(1, 1);
  421.     nonext = 1;
  422.     } else if (!deadf) {
  423.     if (verb == TAKE || verb == REMOVE || verb == CARRY ||
  424.         verb == HOLD)
  425.         vtake();
  426.     else if (verb == DROP)
  427.         vdrop();
  428.     else if (verb == THROW) {
  429.         if (!vthrow())
  430.         vdrop();
  431.     } else if (verb == SIT)
  432.         vsit();
  433.     else if (verb == STAND)
  434.         vstand();
  435.     else if (verb == GET) {
  436.         xretn = vget();
  437.         {
  438.         if (xretn == 1)
  439.             vtake();
  440.         }
  441.     } else if (verb == SHOOT)
  442.         vshoot();
  443.     else if (verb == OPEN)
  444.         vopen();
  445.     else if (verb == SHUT)
  446.         vshut();
  447.     else if (verb == LAND || verb == ACTIVA)
  448.         vship();
  449.     else if (verb == SCRATC)
  450.         vscrat();
  451.     else if (verb == TRANSL)
  452.         speak(71);
  453.     else if (verb == ATTACH)
  454.         vattac();
  455.     else if (verb == POUR || verb == QWATER) {
  456.         if (vpour() == 1)
  457.         vput();
  458.     } else if (verb == WASH)
  459.         vwash();
  460.     else if (verb == EAT)
  461.         veat();
  462.     else if (verb == DRINK)
  463.         vdrink();
  464.     else if (verb == FILL) {
  465.         if (vfill() == 1)
  466.         vpour();
  467.     } else if (verb == IGNITE)
  468.         speak(39);
  469.     else if (verb == TURN)
  470.         vturn();
  471.     else if (verb == READ)
  472.         vread();
  473.     else if (verb == BREAK)
  474.         vbreak();
  475.     else if (verb == FREEZE)
  476.         speak(442);
  477.     else if (verb == PICK) {
  478.         xretn = vpick();
  479.         {
  480.         if (xretn == 1)
  481.             vtake();
  482.         }
  483.     } else if (verb == WEAR)
  484.         vwear();
  485.     else if (verb == PUT) {
  486.         xretn = vput();
  487.         {
  488.         if (xretn == 1)
  489.             vwear();
  490.         if (xretn == 2)
  491.             vdrop();
  492.         if (xretn == 3)
  493.             vpour();
  494.         }
  495.     } else if (verb == LOCK || verb == UNLOCK)
  496.         vlocks();
  497.     else if (verb == LOOK || verb == EXAMIN)
  498.         vlooks();
  499.     else if (verb == PUSH || verb == KISS) {
  500.         {
  501.         if (verb == KISS)
  502.             yretn = vkiss();
  503.         }
  504.         if (yretn == 1 || verb == PUSH) {
  505.         xretn = vpush();
  506.         /* oops! the nova button */
  507.  
  508.         if (xretn == 1)
  509.             errflg = 2;    /* instant out */
  510.  
  511.         else if (xretn > 1) {
  512.             bonus = xretn * 2;
  513.             {
  514.             if (xretn < 5)
  515.                 errflg = 1;    /* out after scoring */
  516.  
  517.             }
  518.             /* change to the "endgame" */
  519.  
  520.             scor = scorng();
  521.             bonus += scor / 5;
  522.             loc = 153;
  523.             oldloc = 0;
  524.             oldlc2 = 0;
  525.             {
  526.             for (ikk = 1; ikk <= SCOIN; ikk++)
  527.                 if (obloc[ikk] != 1000 && obloc[ikk] != 3000)
  528.                 obloc[ikk] = 0;
  529.             }
  530.             obloc[ZKNAPS] = 0;
  531.         }
  532.         }
  533.     } else if (verb == PUNCH) {
  534.         if (vpunch() == 1)
  535.         vbreak();
  536.     } else if (verb == ATTACK)
  537.         vattak();
  538.     else if (verb == DIG)
  539.         vdig();
  540.     else if (verb == GIVE || verb == FEED)
  541.         vgive();
  542.     else if (verb == IS)
  543.         speak(467);
  544.     else if (verb == FUCK) {
  545.         dirty += 1;
  546.         vfuck();
  547.     } else if (loc == 127 && (verb == SHIT || verb == EXHALE
  548.                   || verb == PISS)) {
  549.         loc = 126;
  550.         oldloc = 0;
  551.         oldlc2 = 0;
  552.         speak(312);
  553.     } else if (verb == EXHALE)
  554.         speak(313);
  555.     else if (verb == PISS) 
  556.             vpiss();
  557.     else if (verb == SHIT) 
  558.             vshit();
  559.     else if (verb == INVENT)
  560.         vinven();
  561.     else;
  562.     }
  563.     else speak(46);
  564.  
  565. }
  566.